package com.blog.wl2023.utils;

import com.google.gson.Gson;
import com.qiniu.storage.Configuration;
import com.qiniu.common.QiniuException;
import com.qiniu.http.Response;
import com.qiniu.storage.BucketManager;
import com.qiniu.storage.Region;
import com.qiniu.storage.UploadManager;
import com.qiniu.storage.model.DefaultPutRet;
import com.qiniu.util.Auth;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;

/**
 * @author wule
 * @desc 七牛云上传工具类
 */
//@PropertySource(name = "qiniu",value = {"classpath:application.yml"})
public class QiniuUtil {

	/*ak和ck,获取token的凭证*/
//	@Value("${qiniu.accessKey}")
//	private String accessKey;
	private final String accessKey = "自己的";

//	@Value("${qiniu.secretKey}")
//	private   String secretKey ;
	private final String secretKey = "自己的";

	/*存储空间名*/
//	@Value("${qiniu.bucketName}")
//	private   String bucketName ;
	private final String bucketName = "自己的";

	/*外网访问地址*/
//	@Value("${qiniu.fileDomain}")
//	private String fileDomain;
	private final String fileDomain = "自己的";

	/**
	 * 上传管理器
	 */
	private final UploadManager upload;

	/**
	 * 桶管理器（存储空间管理器）
	 */
	private final BucketManager bucket;

	/**
	 *创建配置对象:
	 *存储支持空间创建在不同的机房，在使用Java SDK中的UploadManager上传文件之前，必须要构建一个上传用的Configuration对象，在该对象中，可以指定空间对应的Region以及其他的一些影响上传的参数
	 **/
	public QiniuUtil() {
		//构造一个带指定Region对象的配置类
		Configuration cfg = new Configuration(Region.region2());

		//创建上传管理器
		upload = new UploadManager(cfg);
		//创建存储空间管理器
		bucket = new BucketManager(getAuth(), cfg);
	}

	/**
	 * 返回认证器（包含的访问密钥）
	 *
	 * @return
	 */
	private Auth getAuth() {
		return Auth.create(accessKey, secretKey);
	}

	/**
	 * 获取令牌对象（服务器返回的授权信息）
	 *
	 * @return
	 */
	private String getToken() {
		return getAuth().uploadToken(bucketName);
	}

	/**
	 * 文件上传
	 *
	 * @param file
	 * @return
	 */
	public String upload(File file, String key) {
		try {
			return upload(new FileInputStream(file), key);
		} catch (FileNotFoundException | QiniuException e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 上传文件
	 *
	 * @param is
	 * @param key
	 * @return
	 * @throws QiniuException
	 */
	public String upload(InputStream is, String key) throws QiniuException {
		//上传流
		Response response = upload.put(is, key, getToken(), null, null);
		//解析返回结果
		DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
		//将文件的访问地址返回
		return fileDomain + putRet.key;
	}

	/**
	 * 删除文件
	 *
	 * @param key 文件名字
	 */
	public void delete(String key) {
		try {
			bucket.delete(bucketName, key);
		} catch (QiniuException e) {
			e.printStackTrace();
		}
	}
}
